package com.bot.utils;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;

public class MoeGirlUtil {

    public static String getInfo(String characterName) throws IOException {
        String url = "https://zh.moegirl.org.cn/" + characterName;

        //jsoup connect设置url   useragent模拟用户代理 反反爬虫  然后get到doc对象（整个html标签页面）  里面的每个内容都是element对象
        try {
            Document doc = Jsoup.connect(url)
                    .userAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36")
                    .get();

            // 优先查找 moe-infobox div 中的表格
            Element table = null;
            Element infoboxDiv = doc.selectFirst("div[class~=moe-infobox]");
            if (infoboxDiv != null) {
                table = infoboxDiv.selectFirst("table");
            }

            // 如果没有找到，尝试直接匹配 infobox 表格
            if (table == null) {
                table = doc.selectFirst("table[class~=infobox]");
            }

            // 回退机制：选择页面中第一个表格
            if (table == null) {
                table = doc.selectFirst("table");
            }
            //从表格里面爬东西
            if (table != null) {
                Map<String, String> infoMap = new LinkedHashMap<>();
                Elements rows = table.select("tr");

                for (Element row : rows) {
                    // 跳过图片行和标题行
                    if (row.hasClass("infobox-image-container") ||
                            row.hasClass("infobox-title") ||
                            row.selectFirst("img") != null) {
                        continue;
                    }
                    // 获取到标题和内容
                    Elements ths = row.select("th");
                    Elements tds = row.select("td");

                    // 情况1：标准键值行 (th + td)
                    if (!ths.isEmpty() && !tds.isEmpty()) {
                        String key = cleanText(ths.first()).replaceAll("[:：\\s]+$", "").trim();
                        String value = cleanText(tds.first());
                        infoMap.put(key, value);
                    }
                    // 情况2：分组标题行 (th跨列)
                    else if (ths.size() == 1 && ths.first().hasAttr("colspan")) {
                        String key = "分组信息";
                        String value = cleanText(ths.first());
                        infoMap.put(key, value);
                    }
                    // 情况3：多列值行 (多个td)
                    else if (tds.size() >= 2) {
                        String key = cleanText(tds.get(0)).replaceAll("[:：\\s]+$", "").trim();
                        StringBuilder valueBuilder = new StringBuilder();
                        for (int i = 1; i < tds.size(); i++) {
                            if (i > 1) valueBuilder.append("、");
                            valueBuilder.append(cleanText(tds.get(i)));
                        }
                        infoMap.put(key, valueBuilder.toString());
                    }
                    // 情况4：单列值行 (只有td)
                    else if (tds.size() == 1) {
                        String value = cleanText(tds.first());
                        if (!infoMap.isEmpty()) {
                            // 尝试附加到上一项
                            String lastKey = infoMap.keySet().toArray()[infoMap.size()-1].toString();
                            infoMap.put(lastKey, infoMap.get(lastKey) + " " + value);
                        }
                    }
                }

                // 格式化输出：替换逗号为换行，等号为冒号
                return formatMapOutput(infoMap);
            } else {
                System.out.println("页面中未找到表格");
                return "未找到角色信息";
            }
        } catch (Exception e) {
            System.err.println("页面获取失败: " + e.getMessage());
            return "获取信息失败：" + e.getMessage();
        }
    }

    private static String formatMapOutput(Map<String, String> infoMap) {
        StringBuilder result = new StringBuilder();
        for (Map.Entry<String, String> entry : infoMap.entrySet()) {
            // 将键值对格式化为 "键：值" 形式
            result.append(entry.getKey())
                    .append("：")
                    .append(entry.getValue())
                    .append("\n"); // 使用换行分隔每个条目
        }

        // 移除最后一个多余的换行符
        if (result.length() > 0) {
            result.setLength(result.length() - 1);
        }

        return result.toString();
    }

    private static String cleanText(Element element) {
        // 克隆以避免修改原始文档
        Element clone = element.clone();

        // 移除不需要的元素
        clone.select("sup, .heimu, img, br, span[style*=hidden]").remove();

        // 处理换行符和特殊空白
        String text = clone.html()
                .replaceAll("<br\\s*/?>", " ")
                .replaceAll("\\s+", " ")
                .replaceAll("、", ", ");

        // 提取纯文本并清理
        return Jsoup.parse(text).text()
                .replaceAll("[\\n\\t]", " ")
                .replaceAll("\\s{2,}", " ")
                .trim();
    }
}